Caffe时间(1) 如何将图片转换为Caffe所需要的LMDB格式

也是综合了很多网上的博客上的教程,但是也各有各的坑,写下此文作为记录
参考链接:
1.caffe下为图像加标签,转换为可执行文件.lmdb格式
2.(原)caffe中通过图像生成lmdb格式的数据
3.【caffe-windows】 caffe-master 之图片转换成lmdb or leveldb
4.深度学习文章3:将自己的图像数据转换成caffe需要的db(leveldb/lmdb)文件
5.Caffe学习系列(11):图像数据转换成db(leveldb/lmdb)文件
6.caffe将各种原始图片数据集转换为lmdb格式并训练网络
7.Caffe︱构建lmdb数据集与各类文件路径名设置细解

首先看一下文件的一个大体的结构

步骤:
1.生成标签文件train.txt和val.txt

下面是生成标签文件的python代码 CreateLabel.py,此文件放在上图image目录下运行

注意图片的标签一定要从0开始!像0,1,2……这样切记!不然可能会出问题

我这里需要做一个二分类,所以标签只是写了0和1两个类别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import os  

def IsSubString(SubStrList,Str):
flag=True
for substr in SubStrList:
if not(substr in Str):
flag=False

return flag

#扫面文件
def GetFileList(FindPath,FlagStr=[]):
FileList=[]
FileNames=os.listdir(FindPath)
if len(FileNames)>0:
for fn in FileNames:
if len(FlagStr)>0:
if IsSubString(FlagStr,fn):
fullfilename=os.path.join(FindPath,fn)
FileList.append(fullfilename)
else:
fullfilename=os.path.join(FindPath,fn)
FileList.append(fullfilename)

if len(FileList)>0:
FileList.sort()

return FileList



train_txt=open('train.txt','w')
#制作标签数据,如果是狗的,标签设置为0,如果是猫的标签为1
imgfile=GetFileList('train/n01440764')#将数据集放在与.py文件相同目录下
for img in imgfile:
str1=img+' '+'1'+'\n' #用空格代替转义字符 \t
train_txt.writelines(str1)


imgfile=GetFileList('train/n02091467')
for img in imgfile:
str2=img+' '+'0'+'\n'
train_txt.writelines(str2)
train_txt.close()


#测试集文件列表
test_txt=open('val.txt','w')
#制作标签数据,如果是男的,标签设置为0,如果是女的标签为1
imgfile=GetFileList('val/n01440764')#将数据集放在与.py文件相同目录下
for img in imgfile:
str3=img+' '+'1'+'\n'
test_txt.writelines(str3)


imgfile=GetFileList('val/n02091467')
for img in imgfile:
str4=img+' '+'0'+'\n'
test_txt.writelines(str4)
test_txt.close()

print("成功生成文件列表")

将生成的两个文件test.txt和val.txt放到上图Data_test文件夹中

2.生成LMDB

我们先复制一个create_imagenet.sh文件的一个副本(这个直接在Caffe根目录下搜索就可以,位置大概是在example/imagenet/下面)我们需要对直接复制过来的文件进行相应参数上的修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
set -e
#下面这三个路径推荐就是用绝对路径写
#你要将生成的lmdb文件放到哪里
EXAMPLE=/home/deep/caffe/examples/My_Files/Build_lmdb
#DATA就是你的数据标签的.txt文件的位置
DATA=/home/deep/caffe/examples/My_Files/Data_test
#TOOLS就是工具的位置编译好的Caffe自带
TOOLS=/home/deep/caffe/build/tools
#下面这两个位置就是训练集和验证集图片的存放位置,注意最后别忘了一个斜杠,因为要以这个位置为基础结合标签文件(即.txt文件)来找到对应的图片,你看到省的.txt文件就算知道是什么意思了,这个在下面提一下(说明1)
TRAIN_DATA_ROOT=/home/deep/caffe/examples/My_Files/image/
VAL_DATA_ROOT=/home/deep/caffe/examples/My_Files/image/

# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
#resize这里默认是false,但是因为我的训练数据不是同样大小的,所以resize一下,改为true
RESIZE=true
if $RESIZE; then
RESIZE_HEIGHT=256
RESIZE_WIDTH=256
else
RESIZE_HEIGHT=0
RESIZE_WIDTH=0
fi

if [ ! -d "$TRAIN_DATA_ROOT" ]; then
echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet training data is stored."
exit 1
fi

if [ ! -d "$VAL_DATA_ROOT" ]; then
echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet validation data is stored."
exit 1
fi

echo "Creating train lmdb..."

#下面这两句是新添加的,因为之前由于参数配置错误在$EXAMPLE下生成了错误的文件导致第二次运行的时候会报错,加上这两句就没问题了
rm -rf $EXAMPLE/train_lmdb
rm -rf $EXAMPLE/val_lmdb
#下数6-7行根据自己的路径自己修改,下面的也是
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
$EXAMPLE/train_lmdb

echo "Creating val lmdb..."

GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$VAL_DATA_ROOT \
$DATA/val.txt \
$EXAMPLE/val_lmdb

echo "Done."

注:说明1

看下图可以看到最前面是没有斜杠的,所以上面一定记得加上

最后成功输出!

坚持原创分享,您的支持将鼓励我继续创作!